home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 2000
/
MacHack 2000.toast
/
pc
/
The Hacks
/
Softshoe
/
Lisa's Mac Parts
/
Views
/
Tiled Views
/
TiledView.cp
< prev
next >
Wrap
Text File
|
2000-06-23
|
4KB
|
170 lines
// TiledView.cp
#ifndef TiledView_h
#include "TiledView.h"
#endif
#ifndef Canvas_h
#include "Canvas.h"
#endif
#ifndef CellVisitor_h
#include "CellVisitor.h"
#endif
#ifndef TiledPane_h
#include "TiledPane.h"
#endif
#ifndef MinMax_h
#include "MinMax.h"
#endif
#ifndef ValidAndInvalidCanvasLoop_h
#include "ValidAndInvalidCanvasLoop.h"
#endif
#ifndef CanvasScreenLoop_h
#include "CanvasScreenLoop.h"
#endif
void TiledView::Deliver( CellVisitor& visitor, const Canvas& canvas )
{
Canvas scratch;
Rectangle32 destination( canvas.FromScreen( visitor.Destination() ) );
for ( PaneLoop pane( Panes() ); pane.Unfinished(); pane++ )
pane->Deliver( visitor, canvas, scratch, destination );
}
void TiledView::ShufflePanes( TiledPane *shuffleFirst )
{
for ( TiledPane* pane = shuffleFirst;
pane != 0;
pane = pane->shuffleNext )
{
// Remember the old bounds for a moment in proposedBounds.
Rectangle32 newBounds = pane->proposedBounds;
pane->proposedBounds = pane->Bounds();
pane->SetBounds( newBounds );
}
for ( ValidAndInvalidCanvasLoop parentCanvas( *this );
parentCanvas.Unfinished();
parentCanvas++ )
for ( CanvasScreenLoop screenCanvas( *parentCanvas );
screenCanvas.Unfinished();
screenCanvas++ )
{
Canvas uncopied( *screenCanvas );
for ( TiledPane* pane = shuffleFirst;
pane != 0;
pane = pane->shuffleNext )
{
Canvas oldCanvas( *screenCanvas );
oldCanvas.Submap( pane->proposedBounds );
Canvas newCanvas( *screenCanvas );
newCanvas.Submap( pane->Bounds() );
Copy( oldCanvas, newCanvas );
uncopied.ObstructOffScreen( pane->Bounds() );
}
}
}
void TiledView::ShufflePanesForward()
{
for ( PaneLoop pane( Panes() ); pane.Unfinished(); pane++ )
pane->shuffleNext = ( pane->link.Next() == 0 )
? 0
: &**pane->link.Next();
ShufflePanes( *Panes().First() );
}
void TiledView::ShufflePanesBackward()
{
for ( PaneLoop pane( Panes() ); pane.Unfinished(); pane++ )
pane->shuffleNext = ( pane->link.Previous() == 0 )
? 0
: &**pane->link.Previous();
ShufflePanes( *Panes().Last() );
}
int32 TiledView::MinimumOf( Measurement measurement ) const
{
int32 minimum = maxint32;
for ( PaneLoop pane( Panes() );
minimum > 0 && pane.Unfinished();
pane++ )
minimum = Min( minimum, (pane->Sizer().*measurement)() );
return minimum;
}
int32 TiledView::MaximumOf( Measurement measurement ) const
{
int32 maximum = 0;
for ( PaneLoop pane( Panes() );
maximum < maxint32 && pane.Unfinished();
pane++ )
maximum = Max( maximum, (pane->Sizer().*measurement)() );
return maximum;
}
int32 TiledView::TotalOf( Measurement measurement ) const
{
int32 total = 0;
for ( PaneLoop pane( Panes() );
total < maxint32 && pane.Unfinished();
pane++ )
total += Min( (pane->Sizer().*measurement)(), maxint32 - total );
return total;
}
int32 TiledView::TotalProposedSize() const
{
int32 total = 0;
for ( PaneLoop pane( Panes() ); pane.Unfinished(); pane++ )
total += pane->proposedSize;
return total;
}
void TiledView::Add( TiledPane& toAdd, BeforeStart )
{
panes.Add( toAdd.link, beforeStart );
toAdd.SetParent( this );
}
void TiledView::Add( TiledPane& toAdd, AfterEnd )
{
panes.Add( toAdd.link, afterEnd );
toAdd.SetParent( this );
}
void TiledView::Add( TiledPane& toAdd, Before, const TiledPane& position )
{
panes.Add( toAdd.link, before, position.link );
toAdd.SetParent( this );
}
void TiledView::Add( TiledPane& toAdd, After, const TiledPane& position )
{
panes.Add( toAdd.link, after, position.link );
toAdd.SetParent( this );
}
void TiledView::Remove( TiledPane& toRemove )
{
toRemove.SetParent( 0 );
panes.Remove( toRemove.link );
}
void TiledView::RemoveAll()
{
while ( !panes.IsEmpty() )
Remove( **panes.First() );
}